/*
题目: 岛屿的最大面积
给你一个大小为 m x n 的二进制矩阵 grid 。

岛屿 是由一些相邻的 1 (代表土地) 构成的组合，这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0（代表水）包围着。

岛屿的面积是岛上值为 1 的单元格的数目。

计算并返回 grid 中最大的岛屿面积。如果没有岛屿，则返回面积为 0 。

https://leetcode.cn/problems/max-area-of-island
 */
public class MaxAreaOfIsland {
    boolean[][] visited = null;
    int[][] dir = new int[][] {{1,0},{-1,0},{0,1},{0,-1}};
    int row, col ;
    int tmp = 0;

    public int maxAreaOfIsland(int[][] grid) {
        row = grid.length;
        col = grid[0].length;
        visited = new boolean[row][col];

        int src = 0;
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (!visited[i][j] && grid[i][j] == 1) {
                    dfs(grid, i, j);
                    src = Math.max(tmp, src);
                    tmp = 0;
                }
            }
        }
        return src;
    }

    private void dfs(int[][] grid, int x, int y) {
        visited[x][y] = true;
        tmp ++;

        for (int i = 0; i < 4; i++) {
            int nextX = x + dir[i][0];
            int nextY = y + dir[i][1];

            if (nextX < 0 || nextX >= row || nextY < 0 || nextY >= col) {
                continue ;
            }
            if (!visited[nextX][nextY] && grid[nextX][nextY] == 1) {
                dfs(grid, nextX, nextY);
            }
        }
    }
}
